Шаг 19 - Корректная проверка версии Windows.

Приложение должно проверить, отвечает ли версия операционной системы минимальным требованиям этого приложения. Приложение должно также устанавливаться и запускаться во всех более поздних версиях данной операционной системы.

Например, если для приложения необходима Windows NT 4.0 с Пакетом обновления 3 (SP3), проверка версии Вашим приложением должна позволять проводить установку в старшей версии 4, младшей версии 0, SP3 , а также устанавливаться во всех операционных системах с номером версии больше этого числа (таких как Windows NT 4.0 с Пакетом обновления 4 (SP4 )), Windows 2000 с любым последующим Пакетом обновления и т.д.).

Исключение: В определенных случаях допускается блокировка установки в более поздних версиях ОС . В этом случае нужно: - Документировать это в Анкете поставщика и объяснить причину.
- При блокировке установки или выполнения вывести сообщение о том, что приложение не поддерживает более поздние версии этой ОС.

Примером могут служить утилиты для работы с диском на низком уровне. Запуск такого приложения в ОС, для которой оно не было протестировано, может впоследствии привести к потере данных пользователя, например, если в файловой системе произошли изменения, о которых данному приложению неизвестно.

В общем, для определения версии ОС следует использовать функцию API GetVersionEx(). Если нужно убедиться, что версия Пакета обновления NT4 более ранняя, чем Пакет обновления 4, для определения версии SP необходимо запросить следующий параметр реестра.

HKLM\system\CurrentControlSet\control\windows\CSDVersion

Значение SDVersion 0x100 соответствует Пакету обновления 1, 0x200 - Пакету обновления 2, и т.д.

Образец кода для проверки требований к версии Windows

Этот код работает на всех 32-разрядных платформах Windows.

BOOL bIsWindowsVersionOK(DWORD dwMajor, DWORD dwMinor, DWORD dwSPMajor )
{
OSVERSIONINFO osvi;
 
// Инициализация структуры OSVERSIONINFO
//
ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx((OSVERSIONINFO*)&osvi);
 
// Сначала старшая версия
if ( osvi.dwMajorVersion > dwMajor )
	return TRUE;
else if ( osvi.dwMajorVersion == dwMajor )
	{
	// Затем младшая
	if (osvi.dwMinorVersion > dwMinor )
		return TRUE;
	else if (osvi.dwMinorVersion == dwMinor )
		{
// Проверить Пакет обновления
		if ( dwSPMajor && 
    		osvi.dwPlatformId == VER_PLATFORM_WIN32_NT )
			{
			HKEY	hKey;
			DWORD dwCSDVersion;
 			DWORD dwSize;
			BOOL	fMeetsSPRequirement = FALSE;
 
			if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
				System\\CurrentControlSet\\Control\\Windows",
0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
				{
				dwSize = sizeof(dwCSDVersion);
				if (RegQueryValueEx(hKey, "CSDVersion",
					NULL, NULL,
(unsigned char*)&dwCSDVersion, 
&dwSize) == ERROR_SUCCESS)
					{
					fMeetsSPRequirement = 
(LOWORD(dwCSDVersion) >= dwSPMajor);
					}
    			RegCloseKey(hKey);
    			}
			return fMeetsSPRequirement;
			}
		return TRUE;
		}
	}
return FALSE;
}
Hosted by uCoz